1、缺失得数字
思想：二分法查找，查找mid下标对应的元素和mid下标是否相等，然后判断在mid左边还是mid右边，最后判断a[l]是否等于l
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 找缺失数字
     * @param a int整型vector 给定的数字串
     * @return int整型
     */
    int solve(vector<int>& a) {
        // write code here
        int l=0;
        int r=a.size()-1;
        while(l<r)
        {
            int mid=(l+r)/2;
            //如果中间下标元素不等于中间下标，说明在中间得左边出了问题，否则在右边
            if(a[mid]!=mid)
                r=mid-1;   //mid左边
            else 
                l=mid+1;   //mid右边
        }
        //判断当前a[l]为多少  如果为l  说明缺失得是后面一个，如果不等于l说明就是该位置
        return a[l]==l?l+1:l;
    }
};
2、合并k个有序链表
思想：将k个链表都加载道优先级队列里面，优先级队列底层为最大堆，因为升序排序（greater，less为降序在这里面）。
class Solution {
public:
    //比较函数，也就是伪函数,也就是operator()即可
    struct cmp
    {
        bool operator()(ListNode* a,ListNode* b)
        {
            //小堆，所以是greater
            return a->val>b->val;
        }
    };
    //思想，就是利用优先级队列，将链表中每个元素都放入到队列中，然后取出链表中元素即可
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(lists.empty())
            return nullptr;
        priority_queue<ListNode*,vector<ListNode*>,cmp> q;
        //读取lists中得每个链表，插入到q中
        for(auto e:lists)
        {
            while(e)
            {
                q.push(e);
                e=e->next;
            }
        }
        ListNode* ans=new ListNode(0);
        ListNode* head=ans;
        while(!q.empty())
        {
            head->next=new ListNode(q.top()->val);  //新建节点，按照队列里节点得值来建
            head=head->next;
            q.pop();
        }
        return ans->next;
    }
};